#ifndef _PAGELIBPREPROCESS_H_
#define _PAGELIBPREPROCESS_H_
#include "WebPage.h"
#include "DirScanner.h"
#include "../Configuration.h"
#include "../../src/PageLib/tinyxml2.h"
#include "SimHash.h"
#include "../SplitTool.h"
#include <utility>
#include <vector>
#include <unordered_map>
#include <regex>
using namespace tinyxml2;
using std::pair;
using std::unordered_map;
using std::vector;
class PageLibPreprocess
{
private:
    //粗糙的网页库，只有标题链接内容，无格式,无去重
    vector<WebPage> _initPageList;
    //合格的网页库，没有重复的
    vector<WebPage> _pageList;
    // 网页偏移库
    unordered_map<int, pair<int, int>> _offsetLib;
    //倒排索引库
    unordered_map < string, vector<pair<int, double>>> _invertIndexLib;
    
    //倒排索引库要用的容器
    //下标为文章id，元素为词，TF/TF*IDF/
    vector<unordered_map<string, double>> _wordWvalue;
    //存储词，DF
    unordered_map<string, double> _wordDF;
    //存储倒排索引库
    unordered_map<string, vector<pair<int, double>>> _invertIndexTable;

    //目录扫描对象
    DirScanner _dirSacnner;
    //哈希去重对象
    SimHash _simHasher;
    //分词对象指针
    SplitTool *_cutTool;
    // xml文件解析
    void RssParse(const string &filename);
    //计算TF-IDF值
    

public:
    PageLibPreprocess(Configuration* conf);
    ~PageLibPreprocess();
    //创建网页库
    void createPageList();
    //创建网页偏移库，必须在创建网页库的函数后调用
    void createOffsetLib();
    //创建倒排索引库
    void createInvertIndexLib();
    // 得到网页库容器
    vector<WebPage>& getPageList();
    //得到偏移库容器
    unordered_map<int, pair<int, int>>& getOffLib();
    //得到倒排索引库容器
    unordered_map<string, vector<pair<int, double>>>& getInvertLib();

    //存储网页库
    void storePageLib(const string& filepath);
    //存储网页偏移库
    void storeOffsetLib(const string& filepath);
    //存储倒排索引库
    void storeInvertLib(const string& filepath);
};

#endif